<template>
  <transition name="todo" appear>
    <li>
      <label>
          <input type="checkbox" :checked="todo.done" @change="handleCheck(todo.id)">
          <!-- 
              如下代码也能实现功能，但是不太推荐，因为违反了props只读的原则
              （直接替换todo Vue会报错，修改todo对象里的值不会报错） 
          -->
          <!-- <input type="checkbox" v-model="todo.done"> -->
          <span v-show="!todo.isEdit">{{todo.title}}</span>
          <input 
            type="text" 
            v-show="todo.isEdit" 
            :value="todo.title"
            @blur="handleBlur(todo,$event)"
            ref="inputTitle"
            />
      </label>
      <button class="btn btn-danger" @click="handleDelete(todo.id)">删除</button>
      <button v-show="!todo.isEdit" class="btn btn-edit" @click="handleEdit(todo)">编辑</button>
    </li>
  </transition>
</template>

<script>
    import pubsub from 'pubsub-js'
    export default {
        name: 'MyItem',
        // 声明接收todo对象
        props: ['todo'],
        mounted(){
            // console.log(this.todo);
        },
        methods: {
            // 勾选or取消勾选
            handleCheck(id){
                // 通知App组件将对应的todo对象的done值取反
                // this.checkTodo(id);
                this.$bus.$emit('checkTodo',id)
            },
            // 删除
            handleDelete(id){
                if(confirm('确定删除吗？')){
                    // this.deleteTodo(id);
                    // this.$bus.$emit('deleteTodo',id)
                    pubsub.publish('deleteTodo',id)
                }
            },
            // 编辑
            handleEdit(todo){
              if(todo.hasOwnProperty('isEdit')){
                todo.isEdit = true
              }else{
                console.log('@')
                this.$set(todo,'isEdit',true)
              }
              // console.log(todo);
              // 上述修改了data中的值之后，vue不会马上去更新视图，会先把该方法全部执行完再去更新视图
              // 视图更新之后，input框自动获取焦点
              this.$nextTick(function(){
                this.$refs.inputTitle.focus()
              })
              // 这种也能实现视图更新之后，input框自动获取焦点
              // setTimeout(()=>{
              //   this.$refs.inputTitle.focus()
              // })
            },
            handleBlur(todo,e){
              todo.isEdit = false
              if(!e.target.value.trim()) return alert('输入不能为空！')
              this.$bus.$emit('updateTodo',todo.id,e.target.value)
              // console.log(todo.id,todo.title)
            }
        }
    }
</script>

<style scoped>
 /*item*/
 li {
    list-style: none;
    height: 36px;
    line-height: 36px;
    padding: 0 5px;
    border-bottom: 1px solid #ddd;
  }

  li label{
    float: left;
    cursor: pointer;
  }

  li label li input{
    vertical-align: middle;
    margin-right: 6px;
    position: relative;
    top: -1px;
  }

  li button{
    float: right;
    display: none;
    margin-top: 3px;
  }

  li:before{
    content: initial;
  }

  li:last-child{
    border-bottom: none;
  }

  /*鼠标悬浮背景色改变*/
  li:hover{
    background-color: #ddd;
  }

  /*鼠标悬浮删除按钮显示*/
  li:hover button{
    display: block
  }



  /* 
      如果<transition>有带name属性，这里的v要改成name 
      比如<transition>中的name属性是hello，这里就是hello-enter-active
  */
  /*.v-enter-active{*/
  .todo-enter-active{
    animation: chenjt 0.5s linear
  }

  /*.v-leave-active{*/
  .todo-leave-active{
      animation: chenjt 0.5s linear reverse;
  }

  @keyframes chenjt {
      from{
          transform: translateX(100%)
      }
      to{
          transform: translateX(0px)
      }
  }

</style>